const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require("koa-bodyparser")
const logger = require('koa-logger')
// 用于解决跨域的中间件
const cors = require('koa2-cors')
// jwt中间件
const jwt = require("jsonwebtoken");
const koajwt = require("koa-jwt");

// 引入两个路由文件
const login = require('./routes/login')
const users = require('./routes/users')

// koa的错误处理
onerror(app)

/*
* 中间件
*/
// 解析 Post 类 HTTP 动词的 body 内容
app.use(bodyparser({
  enableTypes: ['json', 'form', 'text']
}))

const SECRET = require('./config')
// koa-jwt 中间件会获取前端请求中的token,进行检验
app.use(
  koajwt({
    secret: SECRET,
    // key: "user", 默认把token解析的内容保存到 'ctx.user' 中
  }).unless({ path: ["/login"] })
);

// 更好的支持 JSON
app.use(json())
// 开发阶段的日志
app.use(logger())
// 提供 HTTP 静态托管服务
app.use(require('koa-static')(__dirname + '/public'))
// 视图渲染，支持模板引擎
app.use(views(__dirname + '/views', {
  extension: 'pug'
}))

// 记录日志, 自定义的 logger 中间件
app.use(async (ctx, next) => {
  const start = new Date()
  await next()
  const ms = new Date() - start
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})

// 注册路由后, 前端就可以通过接口访问了
app.use(login.routes(), login.allowedMethods())
app.use(users.routes(), users.allowedMethods())

app.use(cors());
//或者
// app.use(
//     cors({
//         origin: function(ctx) { //设置允许来自指定域名请求
//             if (ctx.url === '/test') {
//                 return '*'; // 允许来自所有域名请求
//             }
//             return 'http://localhost:5173'; //只允许http://localhost:5173这个域名的请求
//         },
//         maxAge: 5, //指定本次预检请求的有效期，单位为秒。
//         credentials: true, //是否允许发送Cookie
//         allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], //设置所允许的HTTP请求方法
//         allowHeaders: ['Content-Type', 'Authorization', 'Accept'], //设置服务器支持的所有头信息字段
//         exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'] //设置获取其他自定义字段
//     })
// );


// error-handling
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx)
});

app.listen(3000, () => {
  console.log('服务器已开启')
});

module.exports = app
